package managementSystem;

import java.util.HashMap;
import java.util.ArrayList;

/**
 * 数据库类
 */
@SuppressWarnings({"EnhancedSwitchMigration", "RedundantIfStatement", "StringConcatenationInLoop", "FieldMayBeFinal", "unchecked"})
public class DataBase implements dataBase.DataBase {
    private ArrayList<Student> students = new ArrayList<>();    //学生

    @Override
    public ArrayList<String> batchCreate(String collectionName, ArrayList<Object> dataList) {
        return null;
    }
    @Override
    public Number batchDelete(String collectionName, ArrayList<HashMap<String, Object>> where) {
        return null;
    }
    @Override
    public Number batchUpdate(String collectionName, ArrayList<HashMap<String, Object>> where, Object data) {
        return null;
    }




    @Override
    public String create(String collectionName, Object data) {
        try{
            Boolean result;     //结果
            //新增数据
            Student student = new Student();
            result = this.check(collectionName, (HashMap<String, Object>) data, student.set((HashMap<String, Object>) data));
            this.students.add(student);
            return result ? (student.get(new String[]{"studentId"}).get("studentId") != null ? (String) student.get(new String[]{"studentId"}).get("studentId") : "") : null;
        }
        catch (Exception err){
            System.out.println("errMsg:" + err.getMessage());
        }
        //返回数据
        return null;
    }

    @Override
    public Number delete(String collectionName, ArrayList<HashMap<String, Object>> where) {
        Number delete = 0;      //删除数量
        try{
            //删除数据
            for(Student student : this.students){
                boolean flag = true;
                for(HashMap<String, Object> value : where){
                    flag &= this.instruction((String) value.get("rel"), student.get().get((String) value.get("key")), value.get("val"));
                }
                if(flag){
                    this.students.remove(student);
                    delete = delete.intValue() + 1;
                    break;
                }
            }
        }
        catch (Exception err){
            System.out.println("errMsg:" + err.getMessage());
        }
        //返回数据
        return delete;
    }

    @Override
    public Number update(String collectionName, ArrayList<HashMap<String, Object>> where, Object data) {
        Number update = 0;                                                      //更新数量
        try{
            //更新数据
            for(Student student : this.students){
                boolean flag = true;
                for(HashMap<String, Object> value : where){
                    flag &= this.instruction((String) value.get("rel"), student.get().get((String) value.get("key")), value.get("val"));
                }
                if(flag && this.check(collectionName, (HashMap<String, Object>) data, student.set((HashMap<String, Object>) data))){
                    update = update.intValue() + 1;
                    break;
                }
            }
        }
        catch (Exception err){
            System.out.println("errMsg:" + err.getMessage());
        }
        //返回数据
        return update;
    }

    @Override
    public Object getItem(String collectionName, ArrayList<HashMap<String, Object>> where) {
        try{
            //获取数据
            for(Student student : this.students){
                boolean flag = true;
                for(HashMap<String, Object> value : where){
                    flag &= this.instruction((String) value.get("rel"), student.get().get((String) value.get("key")), value.get("val"));
                }
                if(flag){
                    return student.get();
                }
            }
        }
        catch (Exception err){
            System.out.println("errMsg:" + err.getMessage());
        }
        //返回数据
        return null;
    }

    @Override
    public HashMap<String, Object> getRecords(String collectionName, ArrayList<HashMap<String, Object>> where) {
        ArrayList<HashMap<String, Object>> data = new ArrayList<>();
        try{
            //获取数据
            for(Student student : this.students){
                boolean flag = true;
                if(where != null){
                    for(HashMap<String, Object> value : where){
                        flag &= this.instruction((String) value.get("rel"), student.get().get((String) value.get("key")), value.get("val"));
                    }
                }
                if(flag){
                    data.add(student.get());
                }
            }
        }
        catch (Exception err){
            System.out.println("errMsg:" + err.getMessage());
        }
        //返回数据
        return new HashMap<String, Object>(){{
            put("size", data.size());
            put("data", data);
        }};
    }

    /**
     * 数据库关系指令解析方法
     * @param instruction   关系指令
     * @param value1    值1
     * @param value2    值2
     * @return  解析结果
     */
    private Boolean instruction(String instruction, Object value1, Object value2){
        //解析关系指令
        switch (instruction){
            case "eq":
                if(value1.equals(value2)){
                    return true;
                }
                return false;

            case "neq":
                if(!value1.equals(value2)){
                    return true;
                }
                return false;

            case "lt":
                if((double) value1 < (double) value2){
                    return true;
                }
                return false;

            case "lte":
                if((double) value1 <= (double) value2){
                    return true;
                }
                return false;

            case "gt":
                if((double) value1 > (double) value2){
                    return true;
                }
                return false;

            case "gte":
                if((double) value1 >= (double) value2){
                    return true;
                }
                return false;

            case "search":
                if(((String) value1).contains((String) value2)){
                    return true;
                }
                return false;

            default:
                System.out.println(instruction + "操作指令不存在");
                return false;
        }
    }

    /**
     * 检查方法
     * @param collectionName    集合名
     * @param data  数据
     * @param setSuccessFields  设置成功字段
     */
    private Boolean check(String collectionName, HashMap<String, Object> data ,ArrayList<String> setSuccessFields){
        String errMsg = "";                                                     //错误信息
        HashMap<String, HashMap<String, String>> check = new HashMap<>(){{      //检查信息
            put("Student", new HashMap<String, String>() {{
                put("classes", "\\d{4}");
                put("headTeacher", "\\S+");
                put("grades", "grades设置失败;");
                put("sex", "sex正则校验失败;(男|女);");
                put("major", "major正则校验失败;\\S+;");
                put("name", "name正则校验失败;\\S{1,64};");
                put("address", "address正则校验失败;\\S{1,64};");
                put("studentId", "studentId正则校验失败;\\d{12};");
                put("born", "born正则校验失败;(18|19|20)\\d{2}-(0|1)\\d-(0|1|2|3)\\d;");
                put("college", "college正则校验失败;(电气与信息工程学院|纺织服装学院|计算机与通信学院|经济学院|外国语学院|设计艺术学院|机械工程学院|材料与化工学院|管理学院|计算科学与电子学院|建筑工程学院|建筑工程学院|应用技术学院);");
                put("identity", "identity正则校验失败;(([1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}(\\d|(X|x)))|([1-9]\\d{7}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}));");
                put("nationality", "nationality正则校验失败;(汉族|满族|蒙古族|回族|藏族|维吾尔族|苗族|彝族|壮族|布依族|侗族|瑶族|白族|土家族|哈尼族|哈萨克族|傣族|黎族|傈僳族|佤族|畲族|高山族|拉祜族|水族|东乡族|纳西族|景颇族|柯尔克孜族|土族|达斡尔族|仫佬族|羌族|布朗族|撒拉族|毛南族|仡佬族|锡伯族|阿昌族|普米族|朝鲜族|塔吉克族|怒族|乌孜别克族|俄罗斯族|鄂温克族|德昂族|保安族|裕固族|京族|塔塔尔族|独龙族|鄂伦春族|赫哲族|门巴族|珞巴族|基诺族);");
            }});
        }};
        for(String key : data.keySet()){
            //如果设置失败则添加错误信息
            if(!setSuccessFields.contains(key)){
                //获取错误信息
                String errorMessage = check.get(collectionName).get(key);
                //添加错误信息
                errMsg += errorMessage != null ? errorMessage : (key + "属性不存在;") + "\n";
            }
        }
        //如果存在错误信息则输出
        if(errMsg.length() != 0){
            //打印错误信息
            System.out.println(errMsg);
            //返回数据
            return false;
        }
        //返回数据
        return true;
    }
}